<?php

/**
 * 导入类（注意将QrCode取一个别名，否则与本文件中的类重名）
 */
use Endroid\QrCode\QrCode as MyQRCode;
use Endroid\QrCode\ErrorCorrectionLevel;
use Endroid\QrCode\LabelAlignment;
use Endroid\QrCode\Response\QrCodeResponse;

/**
 * 二维码操作类
 */
class QrCode {

    /**
     * 保存一个二维码，并返回地址信息
     *
     * @param array $config 配置数组
     * @param string $content 二维码文字内容
     * @param string $logo logo地址，默认为空字符串
     * @return Section
     */
    public static function gen(array $config, string $content, string $logo = '') {
        try {
            // 取qrcode对象
            $qr = self::_getInstance($config, $content, $logo);

            // 生成日期目录、实际目录，并且创建该实际目录
            $dateDirname = File::getDateDirname();
            $dirname = $config['saveTemp'] . '/' . $dateDirname;
            File::mkdir($dirname);

            // 生成新的文件名
            $filename = File::getNewFilename() . '.png';

            // 保存文件到本地
            $qr->writeFile($dirname . '/' . $filename);

            // 声明上传到oss的全路径
            $object = $config['dir'] . '/' . $dateDirname . '/' . $filename;

            // 声明当前已上传文件全路径
            $filepath = $dirname . '/' . $filename;

            // 上传到AliyunOSS
            $section = AliyunOSS::upload(ALIYUN_OSS, $config['bucket'], $object, $filepath);
            if (!$section['success']) {
                return Section::fail('抱歉，生成二维码失败！');
            }

            // 声明url地址
            $url = 'http://' . $config['cdn'] . '/' . $object;

            // 返回上传成功
            return Section::ok($url);
        } 
        
        // 操作出错
        catch (\Exception $e) {
            return Section::fail('抱歉，生成二维码失败！');
        }
    }

    /**
     * 获取二维码对象的实例
     *
     * @param array $config 配置数组
     * @param string $content 二维码文字内容
     * @param string $logo logo地址，默认为空字符串
     * @return MyQrCode
     */
    private static function _getInstance(array $config, string $content, string $logo) {

        // 生成对象，并设置统一属性
        $qr = new MyQrCode($content);
        $qr->setWriterByName('png');
        $qr->setEncoding('UTF-8');
        $qr->setErrorCorrectionLevel(new ErrorCorrectionLevel(ErrorCorrectionLevel::HIGH));
        $qr->setRoundBlockSize(true);

        // 设置必有的配置属性
        $qr->setSize($config['size']);
        $qr->setMargin($config['margin']);
        $qr->setForegroundColor($config['foreground']);
        $qr->setBackgroundColor($config['background']);
        
        // 设置logo
        if ($logo != '') {
            $qr->setLogoPath($logo);
            $qr->setLogoSize($config['logoSize'][0], $config['logoSize'][1]);
        }

        // 返回qrcode对象
        return $qr;
    }
}
